被問的一題示範我的拆題方式
系列:前端面試的 30 個為什麼——從 JavaScript 機制講到 React 實戰
難度:★★☆☆☆
關聯:本篇是全系列的起點,第 20 到 27 天的 React 與 Next.js 篇會回頭引用這裡的「變更偵測」比較表。
先回答一個很實際的問題:面試時的「一句話」到底要多長?
我的標準是 15 到 40 個字,一口氣念得完,中間不用換氣。超過 40 個字,你自己講到一半會開始想「我剛剛講到哪」,面試官也會失焦。
驗收方式很簡單:唸出來,如果需要換氣,就是太長了。
實際示範。我原本寫的版本是這樣:
React 是前端三大函式庫跟框架之一,由 Facebook 的 React 團隊開發,主要採取虛擬 DOM 的機制更新畫面,現在都是函式型元件,生命週期的觀念跟純函式、不可變的特性尤為重要。
這段有 79 個字,塞了五個資訊點:定位、開發者、Virtual DOM、函式型元件、純函式與不可變。問題不在講錯,而在它把後面三題的答案一次講完了,面試官接不下去,你也沒有梗可以往下鋪。
壓縮成一句話:
React 是 Meta 開發的 UI 函式庫,核心是把畫面寫成狀態的函數,你只描述畫面長什麼樣,更新的事情交給它做。
38 個字。剩下的「Virtual DOM」「不可變」「函式型元件」全部留到第三步再放,這樣你有東西可以繼續講,而且是被追問著講,不是自己硬塞。
定義背得再熟,講不出落點就是紙上談兵。
三個框架都在解同一個問題:資料變了,畫面怎麼跟著變?
差別只在兩件事:
React:你要主動告訴它
React 本身不知道你的資料變了。你呼叫 setState,它才知道。知道之後它做的事情是:
memo、useMemo、useCallback 去擋。值得注意的是 React Compiler 在 2025 年 10 月推出 v1.0 穩定版,它會在編譯期自動幫你插入 memo 化,這一題的答案已經跟兩年前不一樣了。面試講到這裡如果你能補一句「不過 Compiler 穩定之後,手動 memo 的必要性下降很多」,會很加分。
Vue:它自己知道
Vue 3 用 Proxy 攔截屬性存取,在元件 render 的時候記下「這個元件讀了哪些資料」。資料一改,它直接知道要重跑哪個元件,不用從根往下找。
再加上編譯期的三個優化:
Angular:從髒檢查走到訊號
OnPush 策略剪枝。Ivy 引擎(v9 起預設)改用 Incremental DOM,把每個元件編譯成自己的指令,好處是可以 tree-shaking,記憶體佔用低。| React | Vue 3 | Angular(現代) | |
|---|---|---|---|
| 怎麼知道資料變了 | 你呼叫 setState 告訴它 | Proxy 自動追蹤依賴 | Signals 自動追蹤(舊版靠 Zone.js 攔截) |
| 更新粒度 | 元件層級,往下重跑 | 元件層級,但只跑有依賴的那個 | 可到節點層級 |
| 編譯期做的事 | 少(React Compiler 補上 memo 化) | 多(Patch Flags、Hoisting、Vapor Mode) | 多(Ivy 編譯成指令) |
| 執行期成本 | 較高,靠 memo 化壓 | 中,靠編譯期壓 | 低,zoneless 之後更低 |
| 心智模型 | 顯式:我說了才更新 | 隱式:它自己會知道 | 混合:Signals 顯式宣告、自動追蹤 |
| 面向 | React | Vue | Angular |
|---|---|---|---|
| 學習曲線 | 中。API 少,但要自己學生態系 | 低。範本語法直覺 | 高。DI、RxJS、模組概念一次來 |
| 語言負擔 | 幾乎沒有,JSX 就是 JS | 要學範本 DSL(v-if、v-for) | 要學 TypeScript 與裝飾器 |
| TypeScript 契合度 | 原生等級,元件就是函式 | 已大幅改善,範本內推導靠 Vue Language Tools | 原生等級,本來就是 TS 寫的 |
| 生態系 | 最大。RN、R3F、Ink 跨到 App、3D、CLI | 中。Nuxt 生態完整 | 中。企業套件齊全 |
| 效能天花板 | 需要調校 | 高,Vapor Mode 後更高 | 高,zoneless 後記憶體與 CPU 都省 |
| 適合團隊 | 各種規模,但需要團隊自訂規範 | 小到中型,或漸進導入 | 大型、多團隊、長生命週期 |
| 台灣職缺量 | 最多 | 次之 | 最少,集中在企業內部系統 |
.map(),不用另外學 v-if、v-for 這套 DSL。當元件要接收「一段可變的 UI」當參數時,直接傳一個函式或元素進去,比 Slot 的宣告推導直覺。setCount(prev => prev + 1) 囉唆,但你 grep 得到所有改動點。v-model 就結束。useEffect 是最容易寫錯的 API,過期閉包、依賴陣列漏填造成的 bug 佔了新手一半的問題。這題我會在第 21 天單獨寫一篇。我自己整理資料時看到不少論點,聽起來很順,但只要面試官剛好熟另一個框架,就會被追問到說不下去:
UI = f(props, state)」——這是理想模型不是實作事實。useEffect、useRef、Context、Server Components 全都是這個公式外的東西。可以講「React 鼓勵你往這個方向寫」,但不要說成「React 保證如此」。vue-tsc 已經相當成熟。差距在縮小,講成硬傷會顯得你資訊停在幾年前。我選 React 主要是兩個理由。第一,JSX 就是 JavaScript,我的 UI 邏輯不用學另一套範本語法,TypeScript 的推導也是原生等級。第二,生態系可以橫向遷移,同一套心智模型可以寫 Web 也可以寫 React Native。至於效能,React 預設確實比 Vue 和現在的 Angular 吃虧,這點我不會硬拗。
在 30 秒版後面接:
如果單看變更偵測,React 是三者裡最粗的。它不知道資料變了,要我呼叫 setState 告訴它,然後整個子樹重跑。Vue 用 Proxy 自動追蹤依賴,加上編譯期的 Patch Flags,能把 diff 範圍壓得很小;Angular 走 Signals 加 zoneless 之後可以精準到節點。所以效能這一項,我認為 React 是靠 React Compiler 在補,而不是天生就贏。
我還是選 React,是因為我這個專案的瓶頸不在 render 效能,而在需求變動速度和一個人維護的成本。React 的自由度讓我能只裝我需要的東西,生態系又夠大,遇到問題找得到現成解法。如果今天是一個十幾個人、要維護五年的企業後台,我會認真考慮 Angular,因為它的規範性正好解決那個情境的痛。
不要講「Vue 不好」。講你的取捨:
Vue 我認為在中小型專案上開發速度是贏的。我選 React 是因為我想把時間投在 JavaScript 本身,而不是框架語法上。JSX 學會了,等於我的 JS 能力可以直接變現;Vue 的範本語法學再熟,換框架時帶不走。這是我的個人押注,不是說 Vue 有問題。
整理到最後我一度很卡:Angular 現在 zoneless 又省記憶體,Vue 又簡潔又要拿掉 Virtual DOM,那我去面 React 的職缺,要怎麼「信心十足」?
後來我想通一件事:面試官不是要你證明 React 客觀上最強,他是要看你知不知道自己放棄了什麼。
會被扣分的答案是「因為 React 最好」「因為大家都用」。這代表你沒比較過。
會被加分的答案是「React 在效能預設值上不如另外兩個,但我這個場景的瓶頸不在那裡,我選它是為了 X,代價是 Y,這個代價我承受得起」。這代表你做過技術選型,而不是被公司選型推著走。
換句話說,你現在的動搖不是弱點,是素材。真正沒比較過的人,連動搖的機會都沒有。
Day 2 講傳值與傳址(call by sharing)。這題看起來是基礎題,但它直接決定了你在 React 裡改 state 為什麼「改了卻沒重新渲染」,會跟第 20 天的 Object.is 那篇串在一起。